/**
 * 
 */
package ar.com.ford.it.fullEconomics.interfaces;

import java.sql.Timestamp;
import java.util.Collection;
import java.util.Iterator;
import ar.com.ford.it.fullEconomics.exception.FullEconomicsException;
import ar.com.ford.it.fullEconomics.interfaces.exception.FileNotFoundInDatabaseException;
import ar.com.ford.it.fullEconomics.interfaces.interfaz.InterfaceProccesFile;
import ar.com.ford.it.fullEconomics.logic.LogProcessLogic;
import ar.com.ford.it.fullEconomics.persistence.dto.Teesx01Intfsource;
import ar.com.ford.it.fullEconomics.persistence.dto.Teesx02Fileconten;
import ar.com.ford.it.fullEconomics.persistence.dto.Teesx03Intflog;
import ar.com.ford.it.fullEconomics.util.FullEconomicsDateUtil;

/**
 * @author lsparaci
 *
 */
public class CommonInterfaceLauncher {

	public boolean processFile(Teesx02Fileconten fileConten, InterfaceProccesFile inStrategy, String processName, String userId ){

		boolean bResult = false;
		
		LogProcessLogic logProcess = new LogProcessLogic();
        Teesx03Intflog intflog = null;
        ReadFile parser;
        
        try {
            
        	parser = new ReadFile(fileConten,processName);
        	
        	// Cancela Log de ultima corrida previa
            Teesx03Intflog lastIntfLog = logProcess.getLastIntfLog(fileConten
                    .getEesx01Intfsource());
            if (lastIntfLog != null
                    && lastIntfLog.getEesx03IlogProcStatusCodeC()
                            .equalsIgnoreCase("R")) {
                long diffInHours = FullEconomicsDateUtil.getDifferenceInHours(
                        lastIntfLog.getEesx03IlogStartM(), new Timestamp(System
                                .currentTimeMillis()));
                // si es mayor a 6 horas, lo cierro y abro el nuevo
                if (diffInHours > 6) {
                    logProcess
                            .insertLogIntfLevent(
                                    userId,
                                    lastIntfLog,
                                    "E",
                                    "Se cancelo el proceso, tiempo de corrida mayor a 6 horas",
                                    0);
                }else{
                	
                	// Aviso de que hubo un intento de reprocesar algo dentro de las 6 horas de inicio.
                	logProcess
                    .insertLogIntfLevent(
                            userId,
                            lastIntfLog,
                            "E",
                            "Cancelada corrida actual, a pesar de no haber transcurrido 6 horas",
                            0);
                } // if diffInHours > 6
                
                logProcess.updateLogInfo(lastIntfLog, "C", new Timestamp(
                        System.currentTimeMillis()));
            } 
            
        	// Crea un nuevo Log para registrar esta ejecucion
        	
            // Status Proces Running
            intflog = logProcess.insertLogInf(fileConten.getEesx01Intfsource()
            		, fileConten, userId, "R",
                    new Timestamp(System.currentTimeMillis()));
            parser.processLineByArray(inStrategy, intflog, userId);
            logProcess.updateLogInfo(intflog, "S", new Timestamp(System
                    .currentTimeMillis()));
            bResult = true;
            
            
        } catch (FullEconomicsException e) {
            logProcess.updateLogInfo(intflog, "C", new Timestamp(System
                    .currentTimeMillis()));

        } catch (FileNotFoundInDatabaseException fnf) {
       		System.out.println(fnf.getMessage());
       		logProcess.updateLogInfo(intflog, "C", new Timestamp(System
                    .currentTimeMillis()));
        } finally {
        	
        	return bResult;
        	
        }

	}
	
	public void processPendingInterfaceFiles(int intfId, InterfaceProccesFile inStrategy, String processName, String userId, String fileType ){
		
		LogProcessLogic logProcess = new LogProcessLogic();
        Teesx03Intflog intflog = null;
        ReadFile parser;
        Teesx01Intfsource intfSource = new Teesx01Intfsource();
        intfSource.setEesx01IntfIdNumberK(intfId);
        
        try {
            
            Collection<Teesx02Fileconten> pendFiles = null;
            
            pendFiles = logProcess.getFileContentsByStatus("P", intfSource, null, null);
            
            for (Iterator iterFiles = pendFiles.iterator(); iterFiles.hasNext();) {
        
            	Teesx02Fileconten fileConten = (Teesx02Fileconten) iterFiles.next();
	    
            	parser = new ReadFile(fileConten,processName);
	            	
	            Teesx03Intflog lastIntfLog = logProcess.getLastIntfLog(fileConten
	                    .getEesx01Intfsource());
	            if (lastIntfLog != null
	                    && lastIntfLog.getEesx03IlogProcStatusCodeC()
	                            .equalsIgnoreCase("R")) {
	                long diffInHours = FullEconomicsDateUtil.getDifferenceInHours(
	                        lastIntfLog.getEesx03IlogStartM(), new Timestamp(System
	                                .currentTimeMillis()));
	                // si es mayor a 6 horas, lo cierro y abro el nuevo
	                if (diffInHours > 6) {
	                    logProcess
	                            .insertLogIntfLevent(
	                                    userId,
	                                    lastIntfLog,
	                                    "E",
	                                    "Se cancelo el proceso, tiempo de corrida mayor a 6 horas",
	                                    0);
	                    logProcess.updateLogInfo(lastIntfLog, "C", new Timestamp(
	                            System.currentTimeMillis()));
	
	                }else{
	                	
	                	// Aviso de que hubo un intento de reprocesar algo dentro de las 6 horas de inicio.
	                	logProcess
                        .insertLogIntfLevent(
                                userId,
                                lastIntfLog,
                                "W",
                                "Hubo un intento de volver a procesar la ejecucion en curso",
                                0);
	
	                } // Else siffInHours > 6
	            } else if(lastIntfLog != null
	                    && lastIntfLog.getEesx03IlogProcStatusCodeC()
                        .equalsIgnoreCase("C")) {
	            	
                    // Si el ultimo log del archivo dio Cancelado,
	            	// requiere intervencion para reproceso manual y
	            	// no continua
	            	logProcess
                    .insertLogIntfLevent(
                            userId,
                            lastIntfLog,
                            "E",
                            "Ultimo proceso con Error. No se puede continuar proceso automatico hasta intervencion manual",
                            0);
	            	return;
	            	
	            } else {
	            	// Si el ultimo archivo dio "S" 
	            	// o no hay registros de ejecucion para este archivo
	            	
	                // Status Proces Running
	                intflog = logProcess.insertLogInf(intfSource, fileConten, userId, "R",
	                        new Timestamp(System.currentTimeMillis()));
	                
	                if (fileType.equalsIgnoreCase("B")) {
	                	
	                    if (fileConten.getEesx02FconContentSizeQ() > 0) 
	                    {
	                	   parser.processLineByArray(inStrategy, intflog, userId);
	                    } 
	                   //parser.processLineByArray(inStrategy, intflog, userId);
	                   logProcess.updateLogInfo(intflog, "S", new Timestamp(System
		                        .currentTimeMillis()));
	                } else if (fileType.equalsIgnoreCase("T")) {
	                   parser.processLineByLine(inStrategy, intflog, userId);
	                   logProcess.updateLogInfo(intflog, "S", new Timestamp(System
		                        .currentTimeMillis()));
	                } else {
	                	logProcess.insertLogIntfLevent(userId,lastIntfLog,"E",
                                "El archivo no se especifico ni como Texto ni como Binario",
                                0);
	                	logProcess.updateLogInfo(intflog, "C", new Timestamp(System
		                        .currentTimeMillis()));
	                }

	
	            }
            
            } // for iterFiles
            
        } catch (FullEconomicsException e) {
            logProcess.updateLogInfo(intflog, "C", new Timestamp(System
                    .currentTimeMillis()));

        } catch (FileNotFoundInDatabaseException fnf) {
       		System.out.println(fnf.getMessage());
       		logProcess.updateLogInfo(intflog, "C", new Timestamp(System
                    .currentTimeMillis()));
        }
	
	}

}
